package com.whfc.fse.pushPlatform;

import com.alibaba.fastjson.JSONObject;
import com.whfc.fse.dto.FseCraneDataDTO;
import com.whfc.fse.dto.FseLiftDataDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.HashMap;

@Component
public class ShengSiFseApi {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    // rabbitMq推送路由
    public final static String push_routing_key = "QZSB-INTERFACE";
    // 塔吊实时
    public final static String crane_type_real = "00001";
    // 塔吊实时循环
    public final static String crane_type_work = "00002";

    public final static String lift_type_real = "00008";

    @Resource(name = "shengSiRabbitTemplate")
    private AmqpTemplate shengSiRabbitTemplate;
    /**
     * 升思塔吊实时数据推送
     */
    public void pushCraneRealData(FseCraneDataDTO fseCraneDeviceData) {
        String devicePushParam = getDevicePushParam(fseCraneDeviceData.getSn());
        if (!StringUtils.hasText(devicePushParam)) {
            logger.info("升思塔吊实时数据推送缺少参数，设备sn={}",fseCraneDeviceData.getSn());
            return;
        }
        String[] strings = new String[41];
        // type (数据类型（必须至少是 5 位数！）)
        //00001：起重机实时数据; 00002：起重机吊装数据
        strings[0] = crane_type_real;
        // 设备串号，ICCID 字符串 如“859545248524563215”
        strings[1] = "";
        // 设备编号
        strings[2] = fseCraneDeviceData.getSn();
        // 调试信息
        strings[3] = "";
        // 倍率
        strings[4] = "0";
        // 额定重量
        strings[5] = "0";
        // 实际重量
        strings[6] = String.valueOf(fseCraneDeviceData.getWeight());
        // 力 矩
        strings[7] = "0.0";
        // 力矩百分比
        strings[8] = String.valueOf(fseCraneDeviceData.getMomentRatio());
        // 小车幅度
        strings[9] = String.valueOf(fseCraneDeviceData.getRange());
        // 吊钩高度(接近地面高度为 0，吊钩完全收起则为最大高度)
        strings[10] = String.valueOf(fseCraneDeviceData.getHeight());
        // 回转角度(126.32)
        strings[11] = String.valueOf(fseCraneDeviceData.getTurnAngle());
        // 风速级别(6.32)
        strings[12] = String.valueOf(fseCraneDeviceData.getWindSpeed());
        // 塔臂倾角(+12.5)
        strings[13] = String.valueOf(fseCraneDeviceData.getDipAngle());
        // 超载报警状态(0 正常 1 预警 2 报警)
        strings[14] = "0";
        // 变幅限位状态(0 正常 1 向前报警 2 向后报警 3 向前预警 4 向后预警)
        strings[15] = "0";
        // 高度限位状态(0 正常 1 向上报警 2 向下报警 3 向上预警 4 向下预警)
        strings[16] = "0";
        // 转角限位状态(0 正常 1 向左报警 2 向右报警 3 向左预警 4 向右预警)
        strings[17] = "0";
        // 倾角限位状态(0 正常 1 预警 2 报警)
        strings[18] = "0";
        // 风速报警状态(0 正常 1 预警 2 报警)
        strings[19] = "0";
        // 力矩报警状态(0 正常 1 预警 2 报警)
        strings[20] = "0";
        // 顶升报警状态(0 正常 1 报警)
        strings[21] = "0";
        // 重量传感器故障状态(0 正常 1 故障)
        strings[22] = "0";
        // 变幅传感器故障状态(0 正常 1 故障)
        strings[23] = "0";
        // 高度传感器故障状态(0 正常 1 故障)
        strings[24] = "0";
        // 回转传感器故障状态(0 正常 1 故障)
        strings[25] = "0";
        // 倾角传感器故障状态(0 正常 1 故障)
        strings[26] = "0";
        // 风速传感器故障状态(0 正常 1 故障)
        strings[27] = "0";
        // 顶升传感器故障状态(0 正常 1 故障)
        strings[28] = "0";
        // 输出控制线故障状态(0 正常 1 故障)
        strings[29] = "0";
        // 工作循环次数"xxxxx"
        strings[30] = "";
        // 上电累计运行时间(60000 单位：秒)
        strings[31] = "0";
        // 上次连接运行时间(60000 单位：秒 连接到服务器坚持的时间)
        strings[32] = "0";
        // 上电后累计连接数("xxxxx" 上电后掉线重启次数)
        strings[33] = "";
        // GPRS 信号强度("xx" 0-30)
        strings[34] = "";
        // 重量 AD 值
        strings[35] = "0";
        // 幅度脉冲
         strings[36] = "0";
        // 高度脉冲
        strings[37] = "0";
        String[] split = devicePushParam.split(",");
        // 设备使用登记编号（由升思科技提供）
        strings[38] = split[0];
        // 验证码（升思科技提供，起重平台生成）
        strings[39] = split[1];
        // 数据供应商编号（升思科技提供，起重平台生成）
        strings[40] = split[2];

        StringBuilder dataBuilds = new StringBuilder();
        for (int i = 0; i < strings.length; i++) {
            if (i+1==strings.length) {
                dataBuilds.append(strings[i]);
            }else {
                dataBuilds.append(strings[i]).append(",");
            }
        }
        //{"data":"00001,,P3112305250100057,,2,1.92,0.0,0.0,0.0,39.6,49.7,189.0,0.3,2.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,,,0,0,0,ef1c33cfa0c9479ebcf54242a8b125ee,56b3c8330d49722de5aededdad3ab37c,32922abb61c94e05ae226fe4d8935694","author":"WT","tag":"DATA"}
        //String data = "00001,,P3112305250100057,,2,1.92,0.0,0.0,0.0,39.6,49.7,189.0,0.3,2.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,,,0,0,0,ef1c33cfa0c9479ebcf54242a8b125ee,56b3c8330d49722de5aededdad3ab37c,32922abb61c94e05ae226fe4d8935694";
        HashMap map = new HashMap<>();
        map.put("data",dataBuilds.toString());
        //数据提供 WT 固定值
        map.put("author", "WT");
        //代表实时数据 固定值
        map.put("tag", "DATA");
        logger.info("升思塔吊实时数据推送:{}",map.toString());
        shengSiRabbitTemplate.convertAndSend(push_routing_key, JSONObject.toJSONString(map));
        logger.info("升思塔吊实时数据推送成功");
    }

    /**
     * 升思升降机实时数据推送
     */
    //{"data":"00008,15010185,15010185,,9,0,0,6.0,6,0.0,0.5,12,0.9,22,1,0,1,0,0,0,0,0,0,0,0,0,0,0,ca7ea6e4b56f4884a0da6f9c0ce732d5,40bf69346e4c7195de455538c75a3ef7,e6e864ebcd5d48a3b624b549d3c68201,1","author":"WT","tag":"DATA"}
    public void pushLiftRealData(FseLiftDataDTO fseLiftDataDTO) {
        String devicePushParam = getDevicePushParam(fseLiftDataDTO.getSn());
        if (!StringUtils.hasText(devicePushParam)) {
            logger.info("升思升降机实时数据推送送缺少参数,设备sn={}",fseLiftDataDTO.getSn());
            return;
        }
        String[] strings = new String[32];
        // type (数据类型（必须至少是 5 位数！）)
        // 00008：升降机实时数据
        strings[0] = lift_type_real;
        // 设备串号，ICCID 字符串 如“859545248524563215”
        strings[1] = "";
        // 设备编号
        strings[2] = fseLiftDataDTO.getSn();
        // 调试信息
        strings[3] = "";
        // 起重量（单位：KG，可以是小数）
        strings[4] = String.valueOf((int)Math.round(fseLiftDataDTO.getWeight()*1000));
        // 重量百分比（1 表示 1%，可以是小数）
        strings[5] = "0";
        // 人数
        strings[6] = String.valueOf(fseLiftDataDTO.getPersonNo());
        // 高度（单位：m，可以是小数）
        strings[7] = String.valueOf(fseLiftDataDTO.getHeight());
        // 高度百分比（1 表示 1%，可以是小数）
        strings[8] = "0";
        // 速度（单位：m/s，可以是小数）
        strings[9] = String.valueOf(fseLiftDataDTO.getSpeed());
        // 倾斜度 1（单位：度，可以是小数）
        strings[10] = String.valueOf(fseLiftDataDTO.getDipAngle());
        // 倾斜度百分比 1（1 表示 1%，可以是小数）
        strings[11] = "0";
        // 倾斜度 2（单位：度，可以是小数）
        strings[12] = "0";
        // 倾斜百分比 2（1 表示 1%，可以是小数）
        strings[13] = "0";
        // 驾驶员身份认证结果（0 为未认证，非零为驾驶员工号）
        strings[14] = "0";
        // 前门锁（1 开启 0 关闭）
        strings[15] = "0";
        // 后门锁（1 开启 0 关闭）
        strings[16] = "0";
        // 前门锁异常状态（0 无异常 1 有异常）
        strings[17] = "0";
        // 后门锁异常状态（0 无异常 1 有异常）
        strings[18] = "0";
        // 重量报警状态(0 正常 1 预警 2 报警)
        strings[19] = "0";
        // 高度限位报警状态(0 正常 1 预警 2 报警)
        strings[20] = "0";
        // 超速报警状态(0 正常 1 预警 2 报警)
        strings[21] = "0";
        // 人数报警状态(0 正常 1 预警 2 报警)
        strings[22] = "0";
        // 倾斜报警状态(0 正常 1 预警 2 报警)
        strings[23] = "0";
        // 上电累计运行时间(60000 单位：秒)
        strings[24] = "0";
        // 上次连接运行时间(60000 单位：秒)
        strings[25] = "0";
        // 上电后累计连接数("xxxxx" 上电后掉线重启次数)
        strings[26] = "0";
        // GPRS 信号强度("xx" 0-30)
        strings[27] = "0";
        String[] split = devicePushParam.split(",");
        // 设备使用登记编号（由升思科技提供）
        strings[28] = split[0];
        // 验证码（升思科技提供，起重平台生成）
        strings[29] = split[1];
        // 数据供应商编号（升思科技提供，起重平台生成）
        strings[30] = split[2];
        // 吊笼笼位(0 左笼 1 右笼 2 单笼)
        strings[31] = split[3];

        StringBuilder dataBuilds = new StringBuilder();
        for (int i = 0; i < strings.length; i++) {
            if (i+1==strings.length) {
                dataBuilds.append(strings[i]);
            }else {
                dataBuilds.append(strings[i]).append(",");
            }
        }
        HashMap map = new HashMap<>();
        map.put("data",dataBuilds.toString());
        //数据提供 WT 固定值
        map.put("author", "WT");
        //代表实时数据 固定值
        map.put("tag", "DATA");
        logger.info("升思升降机实时数据推送:{}",map.toString());
        shengSiRabbitTemplate.convertAndSend(push_routing_key, JSONObject.toJSONString(map));
        logger.info("升思升降机实时数据推送成功");
    }


    // 设备编号  验证码  供应商编号
    private String getDevicePushParam(String sn){
        HashMap<String, String> map = new HashMap<>();
        map.put("24056723","281c3d130db34b55ba640ddf4c84920a,769788a70962501f3a7318caf702328e,194eed84e1574319a7297cc984947653,2");
        map.put("23110380","e86b689f20f047fb83e637048dbb753f,2f8733d3765f61706828f522b38c9b8f,194eed84e1574319a7297cc984947653,2");
        map.put("24020522","c19c9c7f85254897ae9e8a231bcf1d5f,9b42e7db5f603ef2498ba71b8514bd40,194eed84e1574319a7297cc984947653,0");
        map.put("24020504","c19c9c7f85254897ae9e8a231bcf1d5f,9b42e7db5f603ef2498ba71b8514bd40,194eed84e1574319a7297cc984947653,1");
        map.put("13960","3060995b988a4ab98f4334357ba871c8,bd1135e6591494f0df82dd2e97764662,194eed84e1574319a7297cc984947653");
        map.put("16394","704c60ef49054711967093c505d9d764,b4f598ba77baf5addccd50a1284c5aad,194eed84e1574319a7297cc984947653");
        map.put("16320","8044a400ea0455c8272b5193d38ff5f,47e2bb9b3b446ebfbbd45ee137ab8caf,194eed84e1574319a7297cc984947653");
        return map.get(sn);
    }
}
